package com.ddone.transaction.annotation.service.impl;

import com.ddone.transaction.annotation.dao.EmpDao;
import com.ddone.transaction.annotation.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author ddone
 * @date 2024/3/20-18:36
 * TODO: 使用注解的配置方式添加事务接口
 *        1. 选择对应持久层技术的事务管理器 放入IOC 容器即可
 *          <bean 事务管理器 id=推荐 transactionManager
 *          <tx: annotation-driven transaction-manger="事务管理器的beanid"
 *        2.  使用注解进行事务配置即可
 *          @Transactional 可以添加到类上和方法上
 *                  添加到类上 类中的所有方法都生效
 *                  添加到方法上 指定方法生效
 *                  添加到类又添加到方法上,方法会覆盖类
 */
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpDao empDao;

    @Transactional(readOnly = false, timeout = 3)
    // (readOnly = true) 一般不改

    //  timeout() 默认为-1 不超时 单位是second Transaction timed out: deadline was Thu Mar 21 00:45:11 CST 2024
    @Override
    public void transfer(Integer inId, Integer outId, int money) {
        empDao.addMoney(inId, money);
        empDao.subMoney(outId, money);
    }

    @Transactional(propagation = Propagation.MANDATORY)
    @Override
    public void changName(Integer id, String name) {
        log.warn("===========修改姓名开始===========");
        empDao.updateNameById(id, name);
        log.warn("===========修改姓名结束===========");
    }

    @Transactional(propagation = Propagation.MANDATORY)
    @Override
    public void changeSalary(Integer id, int salary) {
        log.warn("===========修改工资开始===========");
        // int i = 1 / 0;
        empDao.updateSalaryById(id, salary);
        log.warn("===========修改工资结束===========");
    }

}
